Python Magic Method
Table of Contents
Section titled “Table of Contents”魔术方法是 Python 对象中特殊方法, 方法开头和结尾, 例如 __init__
python 对象的大多数操作都是通过魔术方法定义的
魔术方法大都由对应的标准函数触发
new and init
Section titled “new and init”__new__
: 在对象实例化前时候调用, 可自定义返回值
__init__
: 在对象创建之后调用, 用来初始化对象属性, 返回值必须是 None
class Person: def __new__(self, *args, **kwargs): print('before create object') return object.__new__(self) def __init__(self, name): print(f'after create object, init object {name}') Person('petter') before create object after create object, init object petter class Person: def __new__(self, *args, **kwargs): print('before create object') return object.__new__(self) def __init__(self, name): print(f'after create object, init object {name}') Person('petter') before create object
注意: 若 __new__
未返回一个实例化对象,则 __init__
不执行
class Person: def __new__(cls, name, age): print('class init') cls.name, cls.age = name, age return cls p = Person(name='lily', age=16) print(f'class {Person.name} {Person.age}') print(f'class {p.name} {p.age}') class init class lily 16 class lily 16
通过魔术方法 new, 使类初始化达到对象初始化的效果
repr str
Section titled “repr str”__repr__
: 返回对象的可打印字符串, 用于调试
__str__
: 返回对象的可打印字符串, 用于用户
class Person: def __repr__(self): return "repr content" def __str__(self): return "str content" p = Person() print(p) # str content print(repr(p)) # repr content
print / str / repr 调用顺序 repr => Person.repr() > object.repr() print / str => Person.str() > Person.repr() > object.repr()
file function name
Section titled “file function name”__file__
: 返回当前模块所在的文件绝对路径
__function__
: 返回当前函数的名称
__name__
: 返回当前模块的名称(若文件为 python 入口文件, 则为 main)
# package.py 写入代码 print(f"package.py {__file__} {__name__}") name = "John" # run.py 写入代码 if __name__ == '__main__': print(f"run.py {__file__} {__name__}") from package import name print(f"import {name = }") # python run.py 执行 run.py run.py E:\文档\Python\run.py __main__ package.py E:\文档\Python\package.py package import name = 'John'
iter next
Section titled “iter next”__iter__
: 返回一个迭代器对象, 用于迭代对象
__next__
: 返回迭代器对象的下一个值, 用于迭代对象
getitem setitem
Section titled “getitem setitem”__getitem__
: 返回对象的某个元素
__setitem__
: 设置对象的某个元素